/**
 * @addtogroup sfc_application.h
 * sfc_application.h
 * @{
 */
/**
 * @file sfc_application.h
 * @brief 系统应用框架类
 * @note
 * @author Leo
 * @date 2019-07-03
 * @version 1.0

 * @par          修改日志
 * <table>
 * <tr><th>Date <th>Version <th>Author <th> Description
 * <tr><td>2019-07-03 <td>1.0 <td>Leo <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _SFC_APPLICATION_H_
#define _SFC_APPLICATION_H_

#include <ofc_object.h>
#include "sfc_task.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 构造一个应用程序框架
 * @par 示例
 * @code
   TSfTaskMain task;

   // 构造app实例
   TSfApplicationCreate(&g_application);

   // 初始化app
   TSfApplicationInitialize(&g_application);

   // 创建并设置主任务
   TMainTaskCreate(&task);
   TSfApplicationSetMainTask(&g_application, &task);

   // 运行
   TSfApplicationRun(&g_application);
 * @endcode
*/
typedef struct TSfApplicationTag TSfApplication;
struct TSfApplicationTag
{
PROTECTED
    TOfObject parent_;
    TOfVirtualMethod Destroy_;

PRIVATE
    TSfTask *main_task_;
};

/**
 * 应用框架的构造函数
 * @param self: 对象实例指针
 * @return 无返回值
 */
void TSfApplicationCreate(TSfApplication *self);

/**
 * 应用框架初始化
 * @note 主任务必须在调用完这个函数后创建
 * @param self: 对象实例
 * @return 无返回值
 */
void TSfApplicationInitialize(TSfApplication *self);

/**
 * 获取应用框架的主任务
 * @param self: 对象实例
 * @return 返回指向主任务的对象
 */
TSfTask *TSfApplicationMainTask(TSfApplication *self);

/**
 * 设置应用框架的主任务.
 * @note 这个函数必须在[TSfApplicationInitialize](@ref TSfApplicationInitialize)之后,[TSfApplicationRun](@ref TSfApplicationRun)前调用
 * @param self: 对象实例
 * @param task: 创建的主任务
 * @return 无返回值
 */
void TSfApplicationSetMainTask(TSfApplication *self, TSfTask *task);

/**
 * 应用框架运行
 * @note 调用前需要创建一个主任务
 * @param self: 对象实例
 * @return 无返回值
 */
void TSfApplicationRun(TSfApplication *self);

/// 主应用框架对象.整个应用程序仅此一份
extern TSfApplication g_application;

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // _SFC_APPLICATION_H_

/**
 * @}
 */
